package com.xinwangai.jingbai.mapper;

import com.xinwangai.jingbai.pojo.DTO.CheckinActivityDTO;
import com.xinwangai.jingbai.pojo.VO.CheckinRecord;
import com.xinwangai.jingbai.pojo.VO.CheckinStats;
import com.xinwangai.jingbai.pojo.VO.CheckinActivity;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;

import java.util.List;
import java.util.Map;

/**
 * 简化版打卡系统数据访问层接口
 * 移除子打卡概念，只保留主打卡活动
 *
 * @author guo.wenliang
 * @since 2025/8/13 18:02
 */
@Mapper
public interface CheckinMapper {

    // ============= 打卡活动相关方法 =============

    /**
     * 插入打卡活动
     */
    int insertCheckinActivity(CheckinActivity checkinActivity);

    /**
     * 更新打卡活动
     */
    int updateCheckinActivity(CheckinActivity checkinActivity);

    /**
     * 删除打卡活动
     */
    int deleteCheckinActivity(Long id);

    /**
     * 根据ID获取打卡活动
     */
    CheckinActivity getCheckinActivityById(Long id);

    /**
     * 获取打卡活动列表
     */
    List<CheckinActivity> getCheckinActivities(@Param("dto") CheckinActivityDTO dto);

    /**
     * 统计打卡活动数量
     */
    int countCheckinActivities(CheckinActivityDTO dto);

    /**
     * 统计用户参与的活动数量
     */
    int countActivitiesByUser(Long userId);

    /**
     * 统计用户进行中的活动数量
     */
    int countActiveActivitiesByUser(Long userId);

    /**
     * 获取用户进行中的活动列表
     */
    List<CheckinActivity> getActiveActivitiesByUser(Long userId);

    // ============= 打卡记录相关方法 =============

    /**
     * 插入打卡记录
     */
    int insertCheckinRecord(CheckinRecord record);

    /**
     * 更新打卡记录
     */
    int updateCheckinRecord(CheckinRecord record);

    /**
     * 删除打卡记录
     */
    int deleteCheckinRecord(Long id);

    /**
     * 批量删除活动的所有打卡记录
     */
    int deleteCheckinRecordsByActivity(Long activityId);

    /**
     * 根据ID获取打卡记录
     */
    CheckinRecord getCheckinRecordById(Long id);

    /**
     * 获取用户的打卡记录列表
     */
    List<CheckinRecord> getCheckinRecordsByUser(Long userId);

    /**
     * 获取我的打卡记录（分页）
     */
    List<CheckinRecord> getMyCheckinRecords(@Param("userId") Long userId, @Param("offset") int offset, @Param("limit") int limit);

    /**
     * 统计我的打卡记录数量
     */
    int countMyCheckinRecords(Long userId);

    /**
     * 获取打卡记录列表（支持多条件查询）
     */
    List<CheckinRecord> getCheckinRecords(@Param("activityId") Long activityId,
                                         @Param("userId") Long userId,
                                         @Param("startDate") String startDate,
                                         @Param("endDate") String endDate,
                                         @Param("offset") int offset,
                                         @Param("limit") int limit);



    /**
     * 统计打卡记录数量
     */
    int countCheckinRecords(@Param("activityId") Long activityId,
                           @Param("userId") Long userId,
                           @Param("startDate") String startDate,
                           @Param("endDate") String endDate);

    /**
     * 获取指定月份的打卡记录
     */
    List<CheckinRecord> getCheckinRecordsByMonth(@Param("userId") Long userId,
                                                @Param("year") String year,
                                                @Param("month") String month,
                                                @Param("activityId") Long activityId);

    /**
     * 获取最近的打卡记录
     */
    List<CheckinRecord> getRecentCheckinRecords(@Param("userId") Long userId, @Param("limit") int limit);

    /**
     * 统计活动的已完成天数
     */
    int countCompletedDaysByActivity(Long activityId);

    // ============= 统计相关方法 =============

    /**
     * 获取用户打卡统计
     */
    CheckinStats getUserCheckinStats(@Param("userId") Long userId, @Param("activityId") Long activityId);

    /**
     * 获取打卡日历数据
     */
    List<Map<String, Object>> getCheckinCalendarData(@Param("userId") Long userId,
                                                    @Param("year") String year,
                                                    @Param("month") String month,
                                                    @Param("activityId") Long activityId);

    /**
     * 获取仪表板统计数据
     */
    Map<String, Object> getDashboardStats(Long userId);

    // ============= 参与者相关方法 =============

    /**
     * 添加参与者
     */
    int addParticipants(@Param("activityId") Long activityId, @Param("participants") List<String> participants);

    /**
     * 移除参与者
     */
    int removeParticipant(@Param("activityId") Long activityId, @Param("participant") String participant);

    /**
     * 获取参与者列表
     */
    List<String> getParticipants(Long activityId);

    /**
     * 加入活动
     */
    int joinActivity(@Param("activityId") Long activityId,
                    @Param("activityTitle") String activityTitle,
                    @Param("userId") Long userId,
                    @Param("userName") String userName);

    /**
     * 退出活动
     */
    int leaveActivity(@Param("activityId") Long activityId, @Param("userId") Long userId);

    /**
     * 检查当天是否打卡
     */
    int checkDailyCheckin(CheckinRecord record);
}
